# -*- coding: utf-8 -*-
# @Time: 2021/11/5 22:46
# @Author: jiuwu
# @Email: 2359196586@qq.com
# @File: utils.py
# @Software: PyCharm
from functools import update_wrapper

from django.contrib.auth.models import Group
from django_redis import get_redis_connection
from rest_framework.permissions import BasePermission

# 自定义权限认证类
from config.dbs.redisConfig import LOGIN_KEY_TEMPLATE


# 本质是装饰器，给接口单独设置权限需要用到这个
def wrap_permission(*permissions, validate_permission=True):  # 设置接口级别的权限
    def decorator(func):
        def wrapper(self, request, *args, **kwargs):
            self.permission_classes = permissions
            if validate_permission:
                self.check_permissions(request)
            return func(self, request, *args, **kwargs)

        return update_wrapper(wrapper, func)

    return decorator


class Mypermission(BasePermission):
    # 重写权限认证方法
    def has_permission(self, request, view):
        user = request.user  # 令牌创建之后会生成一个user保存用户信息，request.user得到用户信息
        # 获取有权限的分组，即老师组,得到一个列表，要用first获得第一个
        group = Group.objects.filter(name='老师').first()

        # 获取令牌用户所属的分组 查出用户所在的所有组 因为有中间表 auth_user_groups
        groups = user.groups.all()
        return user.is_superuser or group in groups


class ActiveUserPermission(BasePermission):  # 用户查询权限
    def has_permission(self, request, view):
        user = request.user
        return user.id == int(view.kwargs['pk']) or user.is_superuser


# 这是一个回调函数,里面传入的值的写法固定，不能更改，函数名随意
def jwt_token(token, user=None, request=None):  # 登录成功就会调用,在返token之前加校验
    '''自定义登录成功返回数据处理函数
    :type user:
    '''
    param = request.data
    uuid = param.get('uuid')  # uuid 和verify是前端要给我的值
    verify = param.get('verify')  # 拿到传入的验证码
    if not uuid or not verify:
        return {'msg': '请输入验证码'}

    # 获取保存的答案
    cache = get_redis_connection(alias='verify_codes')  # 得到缓存对象
    redis_verify = cache.get(LOGIN_KEY_TEMPLATE % uuid)

    cache.delete(LOGIN_KEY_TEMPLATE % uuid)  # 拿到就删除数据库里的数据，刷新验证码 用户只有一次机会
    if not redis_verify:
        return {'msg': '验证码过期'}

    # 传入的验证码和答案进行比较
    if redis_verify.upper() != verify.upper():
        return {'msg': '验证码错误'}
    data = {
        'token': token,
        # user表里面的字段
        'username': user.username,
        'id': user.id,
        'avatar': user.userdetail.avatrar if hasattr(user, 'userdetail') else '1'
    }
    return data
